package simpledb.storage.evict;

import simpledb.storage.PageId;

import java.util.ArrayDeque;
import java.util.Queue;

/**
 * @description:    FIFO页面丢弃策略
 * 根据先进先出的原理淘汰页面
 * 丢弃最先进入缓存的页面：通过队列存储页面的PageId；借助队列尾进、头出的特性，新元素插入到尾部
 * 当页面容量达到最大时，从头部获取要丢弃的页面PageId，丢弃相关页面
 * @author: WYG
 * @time: 2021/11/12 15:20
 */

public class FIFOEvict implements EvictStrategy {
    /**
     * 存储数据的队列
     */
    private final Queue<PageId> queue;

    public FIFOEvict(int numPages) {
        this.queue = new ArrayDeque<>(numPages);
    }

    @Override
    public void modifyData(PageId pageId) {
        // 向尾部插入元素
        boolean offer = queue.offer(pageId);
        if (offer) {
            System.out.println("PageId: " + pageId + " 插入队列成功");
        } else {
            System.out.println("PageId: " + pageId + " 插入队列失败");
        }
    }

    @Override
    public PageId getEvictPageId() {
        // 从队列头部获取元素
        return queue.poll();
    }

}
